package cn.edu.jsu.zjj.controller;

import cn.edu.jsu.zjj.common.result.Result;
import cn.edu.jsu.zjj.constant.MessageConstant;
import cn.edu.jsu.zjj.model.utils.AliOssUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * 通用Controller
 */
@RestController
@Slf4j
@RequestMapping("/common")
@Api(tags = "通用接口")
public class CommonController {

    @Autowired
    private AliOssUtil aliOssUtil;

    public static Map<String, String> res = new HashMap<>();

    @ApiOperation("zip文件上传")
    @PostMapping("/zip-upload")
    public Result<Map<String, String>> zipUpload(@RequestPart("file") MultipartFile file) {
        log.info("文件上传：{}", file);
        // 原始文件名
        String originalName = file.getOriginalFilename();

        if(file.getSize() > 1024 * 1024 * 20){
            return Result.error("文件大小超过20MB");
        }
        // 检查文件扩展名是否为 .zip
        if (!originalName.toLowerCase().endsWith(".zip")) {
            return Result.error("仅允许上传 .zip 文件");
        }

        try {
            // 截取原始文件名的后缀，构造新文件名称
            String extension = originalName.substring(originalName.lastIndexOf("."));
            String objectName = originalName.substring(0, originalName.lastIndexOf(".")) + "-" + System.currentTimeMillis() + extension;

            // 文件的请求路径
            String filePath = aliOssUtil.upload(file.getBytes(), objectName);
            Map<String, String> res = new HashMap<>();
            res.put("filePath", filePath);
            res.put("fileName", objectName);
            return Result.success(res);
        } catch (IOException e) {
            log.error("文件上传失败：{}", e);
            return Result.error(MessageConstant.UPLOAD_FAILED);
        }
    }


    /**
     * 文件上传
     * @param file
     * @return
     */

    @PostMapping("/upload")
    @ApiOperation("文件上传")
    public Result<Map<String, String>> upload(@RequestPart("file") MultipartFile file) {
        //原始文件名
        String originalName = file.getOriginalFilename();
        try {

            //截取原始文件名的后缀，构造新文件名称
//            String objectName = UUID.randomUUID().toString() + originalName.substring(originalName.lastIndexOf("."));
            String objectName = originalName.substring(0, originalName.lastIndexOf(".")) + "-" +  + System.currentTimeMillis() + originalName.substring(originalName.lastIndexOf("."));
            //文件的请求路径
            String fileUrl = aliOssUtil.upload(file.getBytes(), objectName);
            res.put("fileUrl", fileUrl);
            res.put("fileName", objectName);
            return Result.success(res);
        } catch (IOException e) {
            log.error("文件上传失败：{}", e);
        }
        //使用常量来进行引用
        return Result.error(MessageConstant.UPLOAD_FAILED);

    }
    /**
     * 检查文件URL是否有效
     * @param url
     * @return
     */
    @GetMapping("/checkFileUrl")
    @ApiOperation("检查文件URL是否有效")
    public Result<String> checkFileUrl(@RequestParam("url") String url) {
        log.info("检查文件URL：{}", url);

        try {
            // 解析URL获取文件名
            String fileName = url.substring(url.lastIndexOf("/") + 1);
            // 检查文件是否存在
            boolean exists = aliOssUtil.doesObjectExist(fileName);
            if (exists) {
                return Result.success("文件存在");
            } else {
                return Result.error("文件不存在");
            }
        } catch (Exception e) {
            log.error("检查文件URL失败：{}", e);
            return Result.error("检查文件URL失败");
        }
    }
}

